﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Gustozzi.DAL;
namespace Gustozzi.BL
{
    public class ClienteBL
    {
        public int EliminarCliente(int idCliente) 
        {
            VentasDataEntities contexto = new VentasDataEntities(); 

            var oClienteQuery = (from c in contexto.Clientes
                                 where c.codigoCliente == idCliente
                                 select c);

            if (oClienteQuery.Count() > 0)
            {
                Cliente oCliente = oClienteQuery.First();

                var listaDirecciones = (from d in contexto.ClienteDirecciones
                                        where d.codigoCliente == idCliente
                                        select d);

                foreach (var item in listaDirecciones)
                {
                    contexto.DeleteObject(item);
                }

                contexto.DeleteObject(oCliente);
                int numItems= contexto.SaveChanges();
                if (numItems > 0)
                {
                    return numItems;
                }
                else 
                {
                    throw new Exception("No se ha podido eliminar el cliente. Verifique que no tiene transacciones.");
                }
            }
            else 
            {
                throw new Exception ("No se ha encontrado el cliente seleccionado.");
            }

        }
        public int ActualizarCliente(Cliente oCliente, List<ClienteDireccion> lstDirecciones, VentasDataEntities contexto)
        {
            if (oCliente == null)
            {
                throw new Exception("Objeto Cliente nulo");
            }
            if (oCliente.estado.Trim().Equals(string.Empty))
            {
                throw new Exception("Ingrese estado");
            }
            if (oCliente.nombreCliente.Trim().Equals(string.Empty))
            {
                throw new Exception("Ingrese nombre o razon social");
            }
            if (oCliente.codigoTipoCliente <= 0)
            {
                throw new Exception("Ingrese codigo de tipo de cliente");
            }
            if (lstDirecciones == null)
            {
                throw new Exception("Ingrese al menos una dirección");
            }
            if (lstDirecciones.Count == 0)
            {
                throw new Exception("Ingrese al menos una dirección");
            }

            if (contexto == null) { contexto = new VentasDataEntities(); }

            var oClienteQuery = (from c in contexto.Clientes
                                 where c.codigoCliente == oCliente.codigoCliente
                                 select c);

            int codigo = oCliente.codigoCliente;


            if (oClienteQuery.Count() == 0)
            {
                var oClienteQueryId = (from c in contexto.Clientes
                                       select c.codigoCliente);

                codigo = 1;
                if (oClienteQueryId.Count() > 0)
                {
                    codigo = oClienteQueryId.Max();
                    codigo += 1;
                }

                oCliente.codigoCliente = codigo;
            }


            // contexto.AddToClientes(oCliente);

            var lstcodigoDireccion = (from p in contexto.ClienteDirecciones
                                      select p.codigoDireccion);
            int codigoDireccion = 0;
            if (lstcodigoDireccion.Count() > 0)
            {
                codigoDireccion = lstcodigoDireccion.Max();
            }
            codigoDireccion += 1;

            foreach (var item in lstDirecciones)
            {
                if (item.estado != "X")
                {
                    item.codigoCliente = codigo;

                    var lstClienteDireccion = (from p in contexto.ClienteDirecciones
                                               where p.codigoDireccion == item.codigoDireccion
                                               select p);

                    ClienteDireccion oClienteDireccion = null;
                    if (lstClienteDireccion.Count() != 0)
                    {
                        oClienteDireccion = lstClienteDireccion.First();
                    }
                    else
                    {
                        oClienteDireccion = new ClienteDireccion();
                        oClienteDireccion.codigoCliente = codigo;
                        oClienteDireccion.codigoDireccion = codigoDireccion;
                        codigoDireccion += 1;
                    }


                    oClienteDireccion.codigoDistrito = item.codigoDistrito;
                    oClienteDireccion.codigoProvincia = item.codigoProvincia;
                    oClienteDireccion.codigoDpto = item.codigoDpto;
                    oClienteDireccion.codigoTipoDireccion = item.codigoTipoDireccion;
                    oClienteDireccion.descripcionCompleta = item.descripcionCompleta;
                    oClienteDireccion.referenciaAdic = item.referenciaAdic;
                    oClienteDireccion.estado = item.estado;

                    oCliente.ClienteDireccion.Add(oClienteDireccion);

                }
                else 
                {
                    var lstClienteDireccion = (from p in contexto.ClienteDirecciones
                                               where p.codigoDireccion == item.codigoDireccion
                                               select p);

                    ClienteDireccion oClienteDireccion = null;
                    if (lstClienteDireccion.Count() != 0)
                    {
                        oClienteDireccion = lstClienteDireccion.First();
                        contexto.DeleteObject(oClienteDireccion);
                    }
                }

            }

            return contexto.SaveChanges();
        }
    }
}
